home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 21 / Cream of the Crop 21 (Terry Blount) (October 1996).iso / editor / auror300.zip / SCAN2.AML < prev    next >
Text File  |  1996-07-17  |  10KB  |  396 lines

  1. //--------------------------------------------------------------------
  2. // SCAN2.AML
  3. // Scan files for all Occurrences, (C) 1993-1996 by nuText Systems
  4. //
  5. // (see Scan2.dox for user help)
  6. //
  7. // This macro searches multiple files on disk for all occurrences of a
  8. // search string or regular expression pattern.
  9. //
  10. // The following search options can be specified:
  11. //
  12. //   i - ignore case
  13. //   u - search within subdirectories also
  14. //   w - whole words only
  15. //   x - regular expressions
  16. //
  17. // If a directory buffer is passed to the macro (arg 3), then only then
  18. // only the files in the directory buffer are searched, otherwise the
  19. // user us prompted to enter a directory or file specification where
  20. // files will be searched.
  21. //
  22. // After the search has completed, a window is be displayed showing each
  23. // line in each file where the search string was found. A menu is also
  24. // displayed which allows the user to goto the line at cursor, edit all
  25. // displayed lines, and print all displayed lines.
  26. //
  27. // Scan2 can be used as an alternative to the Scan macro. Unlike Scan,
  28. // Scan2 searches each file for all occurrences of the search string.
  29. // For this reason, Scan2 may be slightly slower than Scan.
  30. //
  31. // This macro calls the Scandlg macro.
  32. //
  33. // Usage:
  34. //
  35. // Select this macro from the Macro List (on the Macro menu), or run it
  36. // from the macro picklist <shift f12>.
  37. //--------------------------------------------------------------------
  38.  
  39. include bootpath "define.aml"
  40.  
  41. // scan window colors
  42. constant scan_border_color        = color black on gray
  43. constant scan_title_color         = color black on gray
  44. constant scan_text_color          = color black on gray
  45. constant scan_border_flash_color  = color brightgreen on gray
  46. constant scan_cursor_color        = color black on brightgreen
  47. constant scan_menu_color          = color white on blue
  48. constant scan_menu_hotkey_color   = color yellow on blue
  49. constant scan_menu_hilite_color   = color white on cyan
  50.  
  51. // status window colors
  52. constant status_border_color      = color white on gray
  53. constant status_text_color        = color black on gray
  54. constant status_found_color       = color brightgreen on gray
  55.  
  56. // status window dimensions
  57. constant status_qwidth  = 70  // (for fully qualified scans only)
  58. constant status_height  = 16
  59.  
  60.  
  61. forward gotoline
  62. forward editlines
  63.  
  64. // use fmgr files if run from the file manager
  65. if wintype? "fmgr" then
  66.   passedbuf = getcurrbuf
  67. end
  68.  
  69. // disable <loading> in Ext.aml while this macro is running
  70. event <loading> end
  71.  
  72. // create status window
  73. private function createstatus (width)
  74.   createwindow
  75.   setframe ">b"
  76.   setcolor  border_color  status_border_color
  77.   setcolor  text_color    status_text_color
  78.   settitle "Scanning" 'c'
  79.   setborder "1i"
  80.   setshadow 2 1
  81.  
  82.   // center the window
  83.   height = status_height
  84.   ox = (getvidcols - width) / 2
  85.   oy = (getvidrows - height) / 2
  86.   sizewindow ox oy ox + width oy + height "ad"
  87. end
  88.  
  89.  
  90. macrofile = arg 1
  91.  
  92. // called by Lib.x when a key is entered in the dialog box
  93. function ondialog (keycode)
  94.   // macro help
  95.   if keycode == <f1> then
  96.     helpmacro macrofile
  97.   end
  98. end
  99.  
  100.  
  101. variable searchstr, filespec, options
  102. variable fileoptions, diroptions, subdir
  103.  
  104. // get scan multi-string from the user
  105. scanstring = runmacro (bootpath "macro\\scandlg.x") ''
  106.                       passedbuf "Scan for Occurrences"
  107.  
  108. // use defaults if needed
  109. n = splitstr '' scanstring ref searchstr ref filespec ref options
  110. if n < 3 then
  111.   options = _SearchOpt
  112.   if n < 2 then
  113.     filespec = '.'
  114.   end
  115. end
  116.  
  117. if not scanstring or not searchstr then
  118.   return
  119. end
  120.  
  121. // add the scan string to _scan history buffer
  122. addhistory "_scan" scanstring
  123. addhistory "_find" (joinstr '' searchstr options)
  124.  
  125. options = options + '*'
  126.  
  127. // copy passed buffer
  128. if passedbuf then
  129.   markline 1 (getlines) 'T' passedbuf
  130.   scanbuf = if? (getbinarylen passedbuf) (createbbuf) (createbuf)
  131.   copyblock 'T'
  132.   destroymark 'T'
  133.   delline
  134.   filespec = onname (getbufname passedbuf)
  135.   setbufname filespec
  136.  
  137. // load new buffer if none passed
  138. else
  139.   subdir = pos 'u' options
  140.   filespec = onname (qualify filespec (getbufname))
  141.   fileoptions = (sub 'd' '' _FmgrOpt) + 'f' + _NameStyle + (if? subdir 'vq' '')
  142.   scanbuf = loadbuf filespec '' '' fileoptions
  143.   if subdir then
  144.     diroptions = (sub 'f' '' fileoptions) + 'd'
  145.     insertbuf (qualify "*.*" filespec) '' '' diroptions '' '' (getlines)
  146.   end
  147. end
  148.  
  149. if not scanbuf then
  150.   return
  151. end
  152. if not getlinelen or not (dir? filespec) then
  153.   destroybuf
  154.   display
  155.   queue "msgbox" filespec + " not found"
  156.   return
  157. end
  158.  
  159. // create buffer to hold occurrences
  160. resultbuf = createbuf
  161.  
  162. currbuf scanbuf
  163. fmgr.fsort 'n'
  164.  
  165. // create the status window
  166. createstatus (if? (getbinarylen)
  167.                   length (getpath filespec) + 24 status_qwidth)
  168. display
  169.  
  170. // set line delimiter to use
  171. delimit = hex2bin _LineDlm
  172.  
  173. // do for all files in the scan buffer
  174. repeat
  175.  
  176.   // get the next file
  177.   file = fmgr.fgetfile
  178.  
  179.   // check for subdirectories
  180.   if file [LAST_CHAR] == '\\' then
  181.     if subdir and not (pos ".." file) then
  182.       insertbuf file + (getname filespec) '' '' fileoptions '' '' (getlines)
  183.       while not (getlinelen (getlines)) do
  184.         delline 1 (getlines)
  185.       end
  186.       insertbuf file + "*.*" '' '' diroptions  '' '' (getlines)
  187.     end
  188.  
  189.   elseif loadbuf file '' delimit then
  190.     lines = getlines resultbuf
  191.     name = if? subdir file (getname file)
  192.  
  193.     // display scan progress
  194.     writestr file
  195.     display
  196.  
  197.     // find all occurrences of the search string in the file
  198.     while find searchstr options do
  199.       addline name + '(' + getrow + "): " + gettext  '' '' resultbuf
  200.       col MAX_COL
  201.     end
  202.  
  203.     // remove the file from memory
  204.     destroybuf
  205.  
  206.     // if found, show it on the status window
  207.     if lines < (getlines resultbuf) then
  208.       writestr "FOUND" status_found_color (getcoord 'x1') - 7
  209.     end
  210.  
  211.     writeline
  212.     display
  213.   end
  214. until not down
  215.  
  216. breakoff
  217.  
  218. // delete the status window
  219. destroywindow
  220.  
  221. // destroy the scan buffer
  222. destroybuf
  223.  
  224. // check if anything was found
  225. gotobuf resultbuf
  226. lines = getlines
  227. if lines <= 1 then
  228.   destroybuf
  229.   display
  230.   queue "msgbox"  "'" + searchstr + "' not found"
  231.   return
  232. end
  233.  
  234. // create find occurrences window
  235. resultwin = createwindow
  236. setframe ">bv"
  237. setcolor  border_color        scan_border_color
  238. setcolor  north_title_color   scan_title_color
  239. setcolor  text_color          scan_text_color
  240. setcolor  border_flash_color  scan_border_flash_color
  241. setcolor  menu_color          scan_menu_color
  242. setcolor  menu_hotkey_color   scan_menu_hotkey_color
  243. setcolor  menu_hilite_color   scan_menu_hilite_color
  244. settitle "Occurrences of '" + searchstr + "' in " +
  245.          (onname filespec 't') + " - " + ((getlines resultbuf) - 1) + " lines"
  246. setwinctrl "≡" 2
  247. setborder "1i"
  248. setshadow 2 1
  249.  
  250. // create south menu bar
  251. setframe "+4"
  252. menubar '' 4
  253.   item "{Enter}=Goto+Exit"  gotoline 'x'
  254.   item "{Ctrl-G}=Goto"      gotoline
  255.   item "{Ctrl-E}=Edit"      editlines
  256.   item "{Ctrl-P}=Print"     print
  257.   item "{Esc}=Exit"         destroyobject
  258. end
  259.  
  260. // center the window
  261. width  = getvidcols - 5
  262. height = getvidrows - 10
  263. height = (if? lines >= height height lines) + 2
  264. ox = (getvidcols - width) / 2
  265. oy = (getvidrows - height) / 2
  266. sizewindow ox oy ox + width oy + height "ad"
  267.  
  268. delline 1 1
  269. cursor = createcursor
  270. colorcursor scan_cursor_color
  271. setwincurs cursor
  272. setbuftabs _TabWidth
  273.  
  274. // this object inherits from the 'win' object
  275. settype "win"
  276. resident ON
  277.  
  278. //--------------------------------------------------------------------
  279. // functions
  280. //--------------------------------------------------------------------
  281.  
  282. // goto the line displayed at the cursor
  283. function gotoline (gloptions)
  284.   variable name, linenumber
  285.   parse "{.+} *({[0-9]*}):" (gettext) 'x' ref name ref linenumber
  286.   if open (qualify name filespec) then
  287.     // exit occurrences window, if specified
  288.     if pos 'x' gloptions then
  289.       oldwindow = gotowindow resultwin
  290.       close
  291.       gotowindow oldwindow
  292.       resultwin = ''
  293.